#!/bin/sh

#  2166  apk_resign unpack tianti1.apk
#  2167  apk_resign build tianti1_unpacked tianti2.apk
#  2168  apk_resign sign tianti2.apk ~/apk_keystore/wk.keystore jiayou
#  2169  adb install tianti2.signed.apk
#  2170  adb logcat|grep jswrapper

# cd script dir
cd ${0%/*}

# 配置文件模板
config_template='#!/bin/sh

# APK重签名工具路径
apk_resign="./apk-resign/apk-resign.sh"

# 资源文件目录路径
build_dir="/path/to/your/assets"

# 签名相关配置
keystore_file="~/apk_keystore/your-keystore.keystore"  # 密钥库文件路径
alias_name="your-alias"                                # 密钥别名
storepass="your-storepass"                             # 密钥库密码
keypass="your-keypass"                                 # 密钥密码
'

# 检查配置文件完整性
check_config_integrity() {
    local missing_vars=()
    local invalid_paths=()
    
    # 检查必要的配置变量
    [ -z "$apk_resign" ] && missing_vars+=("apk_resign")
    [ -z "$build_dir" ] && missing_vars+=("build_dir")
    [ -z "$keystore_file" ] && missing_vars+=("keystore_file")
    [ -z "$alias_name" ] && missing_vars+=("alias_name")
    [ -z "$storepass" ] && missing_vars+=("storepass")
    [ -z "$keypass" ] && missing_vars+=("keypass")
    
    # 如果有缺失的变量，输出错误信息和模板
    if [ ${#missing_vars[@]} -gt 0 ]; then
        echo "错误: 配置文件不完整，以下变量缺失:"
        for var in "${missing_vars[@]}"; do
            echo "  - $var"
        done
        echo ""
        echo "请使用以下模板创建或更新配置文件:"
        echo "----------------------------------------"
        echo "$config_template"
        echo "----------------------------------------"
        return 1
    fi
    
    # 检查路径是否有效
    # 展开波浪号 (~) 到用户主目录
    keystore_file_expanded=$(eval echo "$keystore_file")
    
    # 检查文件和目录是否存在
    [ ! -f "$apk_resign" ] && invalid_paths+=("apk_resign: $apk_resign 文件不存在")
    [ ! -d "$build_dir" ] && invalid_paths+=("build_dir: $build_dir 目录不存在")
    [ ! -f "$keystore_file_expanded" ] && invalid_paths+=("keystore_file: $keystore_file 文件不存在")
    
    # 如果有无效的路径，输出错误信息
    if [ ${#invalid_paths[@]} -gt 0 ]; then
        echo "警告: 配置文件中包含无效的路径:"
        for path in "${invalid_paths[@]}"; do
            echo "  - $path"
        done
        echo ""
        echo "请检查并更正这些路径。"
        # 这里返回0而不是1，因为我们希望这只是警告而不是错误
        # 如果您希望这是一个错误，请将return 0改为return 1
        return 0
    fi
    
    return 0
}


# 加载配置文件
if [ -f "./config.sh" ]; then
    source ./config.sh
    # 检查配置文件完整性
    check_config_integrity
    if [ $? -ne 0 ]; then
        exit 1
    fi
else
    echo "错误: 配置文件 config.sh 不存在！"
    echo ""
    echo "请使用以下模板创建配置文件:"
    echo "----------------------------------------"
    echo "$config_template"
    echo "----------------------------------------"
    exit 1
fi

# 检查apk-resign工具是否存在
check_apk_resign() {
    if [ ! -f "${apk_resign}" ]; then
        echo "错误: APK重签名工具 ${apk_resign} 不存在！"
        echo "请在config.sh中设置正确的apk_resign路径"
        exit 1
    fi
    
    # 检查apk-resign依赖
    ${apk_resign} check
    if [ $? -ne 0 ]; then
        echo "错误: APK重签名工具依赖检查失败！"
        exit 1
    fi
    
    echo "APK重签名工具检查通过"
}

# 执行依赖检查
check_apk_resign

# 检查是否提供了APK文件参数
if [ -z "$1" ]; then
    echo "错误: 请提供APK文件路径"
    echo "用法: $0 <apk文件>"
    exit 1
fi

# 检查APK文件是否存在
if [ ! -f "$1" ]; then
    echo "错误: APK文件 $1 不存在"
    exit 1
fi

# 处理密钥库文件路径
# 1. 首先展开波浪号 (~) 到用户主目录
keystore_file_expanded=$(eval echo "$keystore_file")

# 2. 如果密钥库文件路径不是绝对路径，则转换为绝对路径
if [[ "$keystore_file_expanded" != /* ]]; then
    # 获取当前工作目录
    current_dir=$(pwd)
    # 构建绝对路径
    keystore_file_abs="${current_dir}/${keystore_file_expanded}"
else
    # 已经是绝对路径
    keystore_file_abs="${keystore_file_expanded}"
fi


# 确保密钥库文件存在
if [ ! -f "${keystore_file_abs}" ]; then
    echo "错误: 密钥库文件不存在: ${keystore_file_abs}"
    exit 1
fi

# 获取APK文件的完整路径
apkname=$(realpath "$1")
echo "APK文件: ${apkname}"

# 获取APK文件所在的目录
apk_dir="$(dirname "$apkname")"

# 获取APK文件的基本名称（不含路径和扩展名）
apk_basename="$(basename "$apkname" .apk)"

# 解包后的目录
apkname_unpacked="${apk_dir}/${apk_basename}_unpacked"
echo "解包目录: ${apkname_unpacked}"

# 检查解包目录是否存在
if [ ! -d "${apkname_unpacked}" ]; then
    ${apk_resign} unpack ${apkname}
    echo "APK解包成功: ${apkname_unpacked}"
else
    echo "解包目录已存在: ${apkname_unpacked}"
fi

# 再次检查解包目录是否存在
if [ ! -d "${apkname_unpacked}" ]; then
    echo "错误: 解包目录 ${apkname_unpacked} 不存在"
    exit 1
fi

# 使用配置文件中的build_dir
replace_to_dir="${apkname_unpacked}/assets/assets"

# 替换资源文件
echo "替换资源: ${build_dir} -> ${replace_to_dir}"
# 确保目标目录存在
mkdir -p "${replace_to_dir}"

# 检查资源目录是否存在
if [ ! -d "${build_dir}" ]; then
    echo "错误: 资源目录 ${build_dir} 不存在"
    exit 1
fi

# 复制资源文件
rsync -av --progress "${build_dir}/" "${replace_to_dir}"

command rm -rf "${replace_to_dir}/main.js"
command rm -rf "${replace_to_dir}/jsb-adapter"
command rm -rf "${replace_to_dir}/src"

cp -f "${build_dir}/../main.js" "${replace_to_dir}/main.js" 
cp -rf "${build_dir}/../jsb-adapter" "${replace_to_dir}/jsb-adapter"
cp -rf "${build_dir}/../src" "${replace_to_dir}/src"


# 定义输出APK文件名
build_apk_name="${apk_dir}/${apk_basename}_build.apk"
signed_apk_name="${apk_dir}/${apk_basename}_build.signed.apk"

# 删除可能存在的旧文件
if [ -f "${build_apk_name}" ]; then
    rm -f "${build_apk_name}"
fi

if [ -f "${signed_apk_name}" ]; then
    rm -f "${signed_apk_name}"
fi

# 构建APK
${apk_resign} build ${apkname_unpacked} ${build_apk_name} true



# 签名APK
echo "使用以下参数签名APK:"
echo "密钥库: ${keystore_file_abs} (绝对路径)"
echo "别名: ${alias_name}"
# echo "密钥库密码: ${storepass}"
# echo "密钥密码: ${keypass}"
${apk_resign} sign ${build_apk_name} ${keystore_file_abs} ${alias_name} "${storepass}" "${keypass}"

# 检查签名是否成功
if [ $? -ne 0 ] || [ ! -f "${signed_apk_name}" ]; then
    echo "错误: APK签名失败"
    exit 1
fi

echo "APK构建和签名成功: ${signed_apk_name}"
echo "开始安装，请确认已卸载旧版APK"

# 安装APK
adb install ${signed_apk_name}

# 启动应用
echo "正在启动应用..."
${apk_resign} launch ${signed_apk_name}
echo "应用已启动"

# 显示日志
adb logcat|grep jswrapper





